/**
 * 
 */
package kr.pe.johnkim.dayve.activity;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.json.JSONException;

import kr.pe.johnkim.dayve.provider.DayveCategory;
import kr.pe.johnkim.dayve.provider.DayveCategoryDatabaseHandler;
import kr.pe.johnkim.dayve.provider.DayveGroup;
import kr.pe.johnkim.dayve.provider.DayveGroupDatabaseHandler;
import kr.pe.johnkim.dayve.provider.DayveItem;
import kr.pe.johnkim.dayve.provider.DayveLog;
import kr.pe.johnkim.dayve.provider.DayveMember;
import kr.pe.johnkim.dayve.rest.DayveCategoryRest;
import kr.pe.johnkim.dayve.rest.DayveCommonRest;
import kr.pe.johnkim.dayve.rest.DayveItemRest;
import kr.pe.johnkim.dayve.rest.DayveMemberRest;
import kr.pe.johnkim.dayve.util.DayveCommon;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.ActivityManager.RunningTaskInfo;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.DataSetObserver;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Spinner;
import android.widget.SpinnerAdapter;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemSelectedListener;

/**
 * @author johnkim
 *
 */
public class DayveItemRegisterView extends Activity {

	public static final String TAG = DayveItemRegisterView.class.getSimpleName();
	
	// 프로그레스 바.
	ProgressBar registerItemProgressBar;

	// 현재 시간.
	private String currentDate;
	
	// Item Name 입력 란.
	EditText edtTextRegisterItemName;
	
	// Item Name 중복 검사 버튼.
//	Button btnCheckDupliationRegisterItem;
	
	// Category Name.
	TextView txtViewItemRegisterCategoryName;
	
	// Category Comment.
	TextView txtViewItemRegisterCategoryComment;
	
	// Item Comment count.
	TextView txtViewRegisterItemCommentCount;
	
	// Item Comment 입력 란.
	EditText edtTextRegisterItemComment;
	
	// Category 선택 스피너.
	Spinner spnRegisterItemSelectCategory;
	
	// Item 등록 버튼.
	Button btnRegisterItem;

	// Item Name 중복 검사를 한다.
	private static final int THREAD_CHECK_DUPLICATION = 101;

	// Item 을 등록 한다.
	private static final int THREAD_ITEM_REGISTER = 102;

	// 프로그레스 바를 출력 한다.
	private static final int THREAD_PROGRESS_BAR_VISIBLE = 103;

	// 프로그레스 바를 감춘다.
	private static final int THREAD_PROGRESS_BAR_INVISIBLE = 104;

	// Item 저장 성공하면 토스트를 띄운다.
	private static final int THREAD_ITEM_REGISTER_SUCCESS = 105;

	// Item 저장 실패하면 오류발생 다이얼로그 창을 띄운다.
	private static final int THREAD_ITEM_REGISTER_FAIL = 106;

	// Item Name 중복 검사 후 등록 가능한 다이얼로그 창을 띄운다.
	private static final int THREAD_CHECK_DUPLICATION_AVAILABLE = 107;

	// Item Name 중복 검사 후 등록 불가능 다이얼로그 창을 띄운다.
	private static final int THREAD_CHECK_DUPLICATION_UNAVAILABLE = 108;

	// Item Name 중복 검사 오류가 발생 다이얼로그 창을 띄운다.
	private static final int THREAD_CHECK_DUPLICATION_ERROR = 109;
	
	// Mileage 를 적립한다.
	private static final int THREAD_UPDATE_MILEAGE = 110;

	DayveMemberRest dayveMemberRest = new DayveMemberRest();
	DayveItemRest dayveItemRest = new DayveItemRest();
	DayveCommonRest dayveCommonRest = new DayveCommonRest();
	DayveCommon dayveCommon = new DayveCommon();

	// Item Name 중복 검사 결과.
	private String RESULT_CHECK_DUPLICATION = "";

	// Item 저장 결과.
	private String RESULT_ITEM_REGISTER = "";

	// 설정 파일을 가져 온다.
	private String myPreference = "kr.pe.johnkim.dayve.activity_preferences";

	// 아이디.
	private String DAYVE_ID = "";

	// Category name.
	private String DAYVE_CATEGORY_NAME = "";

	// Category id.
	private String DAYVE_CATEGORY_ID = "";
	
	// Spinner group name position.
	public int SPINNER_CATEGORY_NAME_POSITION = 0;

	// 중복 확인 버튼 눌렀는지 체크.
	private int CHECK_DUPLICATION  = 0;

	// DatabaseHandler
//	private DatabaseHandler dbHandler;	
	
	private DayveCategoryDatabaseHandler categoryDatabaseHandler;

	/* (non-Javadoc)
	 * @see android.app.Activity#onCreate(android.os.Bundle)
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.dayve_item_register);
		
		// 현재 시간을 가져 온다.
		currentDate = dayveCommon.getCurrentDate();
		
		// SharedPreferences 정보를 확인 한다.
		confirmNotification();
		
		Intent i = getIntent();
		DAYVE_CATEGORY_ID = i.getStringExtra("categoryId");
		
		// DatabaseHandler 를 연다.
//		dbHandler = DatabaseHandler.open(getApplicationContext());
		
		categoryDatabaseHandler = DayveCategoryDatabaseHandler.open(getApplicationContext());
		
		// 프로그레스 바를 설정 한다.
		registerItemProgressBar = (ProgressBar)findViewById(R.id.registerItemProgressBar);
		
		edtTextRegisterItemName = (EditText)findViewById(R.id.edtTextRegisterItemName);
		edtTextRegisterItemName.requestFocus();
//		btnCheckDupliationRegisterItem = (Button)findViewById(R.id.btnCheckDuplicationRegisterItem);
		txtViewRegisterItemCommentCount = (TextView)findViewById(R.id.txtViewRegisterItemCommentCount);
		edtTextRegisterItemComment = (EditText)findViewById(R.id.edtTextRegisterItemComment);
		spnRegisterItemSelectCategory = (Spinner)findViewById(R.id.spnRegisterItemSelectCategory);
		btnRegisterItem = (Button)findViewById(R.id.btnRegisterItem);
		
		// Cateory name.
		txtViewItemRegisterCategoryName = (TextView)findViewById(R.id.txtViewItemRegisterCategoryName);
		
		// Category Comment.
		txtViewItemRegisterCategoryComment = (TextView)findViewById(R.id.txtViewItemRegisterCategoryComment);
		
		// 중복 확인 버튼을 터치 한다.
//		btnCheckDupliationRegisterItem.setOnClickListener(new View.OnClickListener() {
//
//			public void onClick(View arg0) {
//				// TODO Auto-generated method stub
//				// 중복 확인 버튼 눌렀을때 확인 값을 증가 시킨다.
//				CHECK_DUPLICATION++;
//				
//				if(("").equals(edtTextRegisterItemName.getText().toString().trim())) {
//					new AlertDialog.Builder(DayveItemRegisterView.this)
//					.setTitle("아이템명 중복 확인.")
//					.setMessage("아이템명을 입력 하세요.")
//					.setPositiveButton("확인", 
//						new DialogInterface.OnClickListener() {
//							
////							@Override
//							public void onClick(DialogInterface dialog, int which) {
//								// TODO Auto-generated method stub
//							}
//						}).show();
//				} else {
//					mHandler.sendMessage(mHandler.obtainMessage(THREAD_CHECK_DUPLICATION));
//				}
//			}
//			
//		});
		
		// 입력된 comment 글자 수를 체크 한다.
		TextWatcher watcher = new TextWatcher() {
			
			public void onTextChanged(CharSequence s, int start, int before, int count) {
				// TODO Auto-generated method stub
				int cnt = s.toString().length();
				txtViewRegisterItemCommentCount.setText(String.valueOf(cnt));
				
			}
			
			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {
				// TODO Auto-generated method stub
				
			}
			
			public void afterTextChanged(Editable s) {
				// TODO Auto-generated method stub
				
			}
		};
		
		edtTextRegisterItemComment.addTextChangedListener(watcher);
		
		// Category 목록을 가져 오기 위한 스피너를 설정 한다.
		ArrayList<DayveCategory> categoryList = categoryDatabaseHandler.selectCategoryList("" + 0, "" + 10000);
		
		Log.i(TAG, "categoryList.size() : " + categoryList.size());
		
//		for(int i=0 ; i<categoryList.size() ; i++) {
//			Log.e(TAG, "" + categoryList.get(i).getIdMyHistoryCategories());
//			Log.e(TAG, "" + categoryList.get(i).getName());
//		}
		
		CategorySpinnerAdapter categorySpinnerAdapter = new CategorySpinnerAdapter(categoryList);
		
		spnRegisterItemSelectCategory.setAdapter(categorySpinnerAdapter);
		
		/**
		 * 만약 CategoryAnalysisView 에서 넘어간 경우 기존 Category Name 을 세팅해준다.
		 */
		if(!("").equals(DAYVE_CATEGORY_ID)) {
			DAYVE_CATEGORY_NAME = categoryDatabaseHandler.selectCategory(DAYVE_CATEGORY_ID).getName().toString();
			
			for(int j=0 ; j<categoryList.size() ; j++) {
				if((DAYVE_CATEGORY_NAME).equals(categoryList.get(j).getName())) {
					SPINNER_CATEGORY_NAME_POSITION = j;
				}
			}
			
			// 초기값을 세팅 한다.
			spnRegisterItemSelectCategory.setSelection(SPINNER_CATEGORY_NAME_POSITION);
		}
		
		spnRegisterItemSelectCategory.setOnItemSelectedListener(new OnItemSelectedListener() {

			public void onItemSelected(AdapterView<?> parent, View view,
					int position, long id) {
				// TODO Auto-generated method stub
				DayveCategory dayveCategory = (DayveCategory)parent.getItemAtPosition(position);
				
				DAYVE_CATEGORY_ID = dayveCategory.getIdMyHistoryCategories();
				
				Log.e(TAG, "DAYVE_CATEGORY_ID   : " + DAYVE_CATEGORY_ID);
				Log.e(TAG, "DAYVE_CATEGORY_NAME : " + dayveCategory.getName());
				
				txtViewItemRegisterCategoryName.setText(dayveCategory.getName());
				txtViewItemRegisterCategoryComment.setText(dayveCategory.getComment());
			}

			public void onNothingSelected(AdapterView<?> arg0) {
				// TODO Auto-generated method stub
				
			}
			
		});
		
		// Item 등록 버튼을 터치 한다.
		btnRegisterItem.setOnClickListener(new View.OnClickListener() {

			public void onClick(View v) {
				// TODO Auto-generated method stub
				if(("").equals(edtTextRegisterItemName.getText().toString().trim())) {
					new AlertDialog.Builder(DayveItemRegisterView.this)
					.setTitle(getResources().getString(R.string.item_register_enter_name_title))
					.setMessage(getResources().getString(R.string.item_register_enter_name_message))
					.setPositiveButton(getResources().getString(R.string.item_register_enter_name_button_ok), 
						new DialogInterface.OnClickListener() {
							
//							@Override
							public void onClick(DialogInterface dialog, int which) {
								// TODO Auto-generated method stub
							}
						}).show();
				} else {
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_ITEM_REGISTER));
				}
			}
			
		});
	}
	
	/**
	 * Category 선택 Spinner 에 세팅하기 위한 어댑터 클래스를 정의 한다.
	 * 
	 * @author johnkim
	 *
	 */
	private class CategorySpinnerAdapter implements SpinnerAdapter {

		ArrayList<DayveCategory> data;
		
		public CategorySpinnerAdapter(ArrayList<DayveCategory> data) {
			this.data = data;
		}
		
		public int getCount() {
			// TODO Auto-generated method stub
			return data.size();
		}

		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return data.get(position);
		}

		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}

		public int getItemViewType(int position) {
			// TODO Auto-generated method stub
			return android.R.layout.simple_spinner_dropdown_item;
		}

		public View getView(int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			TextView textView = new TextView(getApplicationContext());
			
			textView.setTextSize(24);
			textView.setTextColor(Color.BLACK);
			textView.setText("  " + data.get(position).getName());
			textView.setSingleLine(true);
			
//			convertView = textView;
			
			return textView;
		}

		public int getViewTypeCount() {
			// TODO Auto-generated method stub
			return 1;
		}

		public boolean hasStableIds() {
			// TODO Auto-generated method stub
			return false;
		}

		public boolean isEmpty() {
			// TODO Auto-generated method stub
			return false;
		}

		public void registerDataSetObserver(DataSetObserver observer) {
			// TODO Auto-generated method stub
			
		}

		public void unregisterDataSetObserver(DataSetObserver observer) {
			// TODO Auto-generated method stub
			
		}

		public View getDropDownView(int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			return this.getView(position, convertView, parent);
		}
		
	}
	
	/**
	 * SharedPreferences 정보를 확인 한다.
	 */
	public void confirmNotification() {
		String myPf = "kr.pe.johnkim.dayve.activity_preferences";
		SharedPreferences mSharedPreferences = getSharedPreferences(myPf, Activity.MODE_PRIVATE);
		
		// id 를 가져 온다.
		DAYVE_ID = mSharedPreferences.getString("dayve_id", "");
	}
	
	/**
	 * Handler 를 등록 한다.
	 */
	private Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch(msg.what) {
			// Item Name 중복 검사를 한다.
			case THREAD_CHECK_DUPLICATION : 
				threadCheckDuplication();
				break;
			// Item 을 등록 한다.
			case THREAD_ITEM_REGISTER : 
				threadRegisterItem();
				break;
			// 프로그레스 바를 출력 한다.
			case THREAD_PROGRESS_BAR_VISIBLE : 
				registerItemProgressBar.setVisibility(View.VISIBLE);
				break;
			// 프로그레스 바를 감춘다.
			case THREAD_PROGRESS_BAR_INVISIBLE : 
				registerItemProgressBar.setVisibility(View.INVISIBLE);
				break;
			// Item 저장 성공하면 토스트를 띄운다.
			case THREAD_ITEM_REGISTER_SUCCESS : 
				showRegisterItemToast();
				break;
			// Item 저장 실패하면 오류발생 다이얼로그 창을 띄운다.
			case THREAD_ITEM_REGISTER_FAIL : 
				showDialogRegisterItemFail();
				break;
			// Item Name 중복 검사 후 등록 가능한 다이얼로그 창을 띄운다.
			case THREAD_CHECK_DUPLICATION_AVAILABLE : 
				showDialogCheckDuplicationAvailable();
				break;
			// Item Name 중복 검사 후 등록 불가능 다이얼로그 창을 띄운다.
			case THREAD_CHECK_DUPLICATION_UNAVAILABLE : 
				showDialogCheckDuplicationUnavailable();
				break;
			// Item Name 중복 검사 오류가 발생 다이얼로그 창을 띄운다.
			case THREAD_CHECK_DUPLICATION_ERROR : 
				showDialogCheckDuplicationError();
				break;
			// Mileage 를 적립한다.
			case THREAD_UPDATE_MILEAGE : 
				checkMileage();
				break;
			}
		}
	};

	/* 화면이 출력되면 로그를 저장 한다.
	 * 
	 * @see android.app.Activity#onResume()
	 */
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		
		// 중복 확인 버튼을 했는지 확인하기 위한 체크 값을 초기화 한다.
		CHECK_DUPLICATION = 0;
		
		// database 를 연다.
		if(categoryDatabaseHandler == null || !categoryDatabaseHandler.getSQLiteDatabase().isOpen()){ 
			categoryDatabaseHandler = DayveCategoryDatabaseHandler.open(getApplicationContext());
		}
		
		// main thread 에서 child thread 를 호출 한다.
		Thread thread = new Thread(null, insertLogBackgroundThreadProcessing, "Background_insertLog");
		thread.start();
	}

	/* 화면을 닫으면서 database 를 닫는다.
	 * 
	 * @see android.app.Activity#onStop()
	 */
	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		
		categoryDatabaseHandler.close();
		
		finish();
	}

	/* (non-Javadoc)
	 * @see android.app.Activity#onBackPressed()
	 */
	@Override
	public void onBackPressed() {
		// TODO Auto-generated method stub
		super.onBackPressed();
		
		finish();
	}
	
	/* 최상위 프로세스가 아닐 경우 프로세스를 종료 한다.
	 * 
	 * => Home Key 를 눌렀을때 프로세스를 종료 한다.
	 * 
	 * @see android.app.Activity#onPause()
	 */
	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		
		if(!isForegrdound()) {
			if(DayveCategoryAnalysisView.activity != null) {
				DayveCategoryAnalysisView.activity.finish();
			}
			
			if(DayveItemView.activity != null) {
				DayveItemView.activity.finish();
			}
			
			System.exit(0);
		}
	}
	
	/**
	 * 현재 프로세스가 최상위로 실행중인지 검사 한다.
	 * 
	 * true : 최상위
	 * 
	 * @return
	 */
	public boolean isForegrdound() {
	    ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
	    List<RunningTaskInfo> list = am.getRunningTasks(1);
	    ComponentName cn = list.get(0).topActivity;
	    String name = cn.getPackageName();
	     
	    return name.indexOf(getPackageName()) > -1;
	}
	
	/**
	 * 카테고리 중복 검사를 한다.
	 * 
	 * 실제 checkDuplication 메소드에서 처리 한다.
	 * 쓰레드로 돌리기 위한 임시 메소드 이다.
	 */
	private void threadCheckDuplication() {
		Log.i(TAG, "threadCheckDuplication");
	
		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub
				checkDuplication();
			}
			
		});
		
		thread.start();
	}
	
	/**
	 * 카테고리명 중복 검사를 한다.
	 */
	private void checkDuplication() {
		Log.i(TAG, "checkDuplication");
		
		DayveItem parameterItem = new DayveItem();
		
		parameterItem.setName(edtTextRegisterItemName.getText().toString().trim());
		parameterItem.setActivateYn("Y");
		parameterItem.setMyHistoryMembersId(DAYVE_ID);
		
		Log.i(TAG, "name               : " + edtTextRegisterItemName.getText().toString().trim());
		Log.i(TAG, "activateYn         : " + parameterItem.getActivateYn());
		Log.i(TAG, "myHistoryMembersId : " + parameterItem.getMyHistoryMembersId());
		
		try {
			RESULT_CHECK_DUPLICATION = dayveItemRest.checkDuplication(parameterItem).getCount();
			
			Log.i(TAG, "RESULT_CHECK_DUPLICATION : " + RESULT_CHECK_DUPLICATION);
			
			// 처리가 끝나면 프로그레스 바를 감춘다.
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		}
		
		/**
		 * 중복 검사 결과에 따라 다이얼로그 창을 띄운다.
		 * 
		 * 1. 카테고리명 등록 가능한 경우.
		 * 2. 이미 등록되어 있는 경우.
		 * 3. 중복 검사시 오류 발생하는 경우.
		 */
		if(("0").equals(RESULT_CHECK_DUPLICATION)) {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_CHECK_DUPLICATION_AVAILABLE));
		} else if(("1").equals(RESULT_CHECK_DUPLICATION)) {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_CHECK_DUPLICATION_UNAVAILABLE));
		} else if(("null").equals(RESULT_CHECK_DUPLICATION)) {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_CHECK_DUPLICATION_ERROR));
		} else if(("ERROR").equals(RESULT_CHECK_DUPLICATION)) {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_CHECK_DUPLICATION_ERROR));
		}
	}
	
	/**
	 * Item Name 중복 검사 후 등록 가능한 다이얼로그 창을 띄운다.
	 */
	private void showDialogCheckDuplicationAvailable() {
		Log.i(TAG, "showDialogCheckDuplicationAvailable");
		
		new AlertDialog.Builder(DayveItemRegisterView.this)
		.setTitle(getResources().getString(R.string.item_register_check_duplication_available_title))
		.setMessage(getResources().getString(R.string.item_register_check_duplication_available_message))
		.setPositiveButton(getResources().getString(R.string.item_register_check_duplication_available_button_ok), 
			new DialogInterface.OnClickListener() {
				
//				@Override
				public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub
				}
			}).show();
	}
	
	/**
	 * Item Name 중복 검사 후 등록 불가능 다이얼로그 창을 띄운다.
	 * 
	 * Item Name 입력란을 지운다.
	 */
	private void showDialogCheckDuplicationUnavailable() {
		Log.i(TAG, "showDialogCheckDuplicationUnavailable");
		
		new AlertDialog.Builder(DayveItemRegisterView.this)
		.setTitle(getResources().getString(R.string.item_register_check_duplication_already_exist_title))
		.setMessage(getResources().getString(R.string.item_register_check_duplication_already_exist_message))
		.setPositiveButton(getResources().getString(R.string.item_register_check_duplication_already_exist_button_ok), 
			new DialogInterface.OnClickListener() {
				
//				@Override
				public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub
				}
			}).show();
		
		edtTextRegisterItemName.setText("");
	}
	
	/**
	 * Item Name 중복 검사 오류가 발생 다이얼로그 창을 띄운다.
	 */
	private void showDialogCheckDuplicationError() {
		Log.i(TAG, "showDialogCheckDuplicationError");
		
		new AlertDialog.Builder(DayveItemRegisterView.this)
		.setTitle(getResources().getString(R.string.item_register_check_duplication_fail_check_title))
		.setMessage(
				getResources().getString(R.string.item_register_check_duplication_fail_check_message_01) + 
				"\n" + 
				getResources().getString(R.string.item_register_check_duplication_fail_check_message_02)
				)
		.setPositiveButton(getResources().getString(R.string.item_register_check_duplication_fail_check_button_ok), 
			new DialogInterface.OnClickListener() {
				
//				@Override
				public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub
				}
			}).show();
	}
	
	/**
	 * Item 을 등록 한다.
	 * 
	 * 실제 로직은 registerItem 메소드에서 처리한다.
	 * 쓰레드로 돌리기 위한 임시 메소드 이다.
	 */
	private void threadRegisterItem() {
		Log.i(TAG, "threadRegisterCategory");
		
		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub
				registerItem();
			}
			
		});
		
		thread.start();
	}
	
	/**
	 * Item 을 등록 한다.
	 */
	private void registerItem() {
		Log.i(TAG, "registerItem");
		
		DayveItem parameterItem = new DayveItem();
		
		parameterItem.setName(edtTextRegisterItemName.getText().toString().trim());
		parameterItem.setComment(edtTextRegisterItemComment.getText().toString().trim());
		parameterItem.setAmount("0");
		parameterItem.setOpenItemYn("N");
		parameterItem.setFavoriteYn("N");
		parameterItem.setActivateYn("Y");
		parameterItem.setModifyDate(currentDate);
		parameterItem.setRegisterDate(currentDate);
		parameterItem.setMyHistoryMembersId(DAYVE_ID);
		parameterItem.setMyHistoryCategoriesIdMyHistoryCategories(DAYVE_CATEGORY_ID);
		
		try {
			RESULT_ITEM_REGISTER = dayveItemRest.registerItem(parameterItem).getResult();
			
			Log.i(TAG, "RESULT_ITEM_REGISTER" + RESULT_ITEM_REGISTER);
			
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		}
		
		/**
		 * 등록 결과에 따라서 다이얼로그 창을 띄운다.
		 * 
		 * 등록에 성공하면 등록화면을 닫고 카테고리 목록 화면으로 이동 한다.
		 * 등록에 실패하면 다이얼로그 창을 띄워서 다시 등록할 것인지 확인 한다.
		 */
		if(("SUCCESS").equals(RESULT_ITEM_REGISTER)) {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_ITEM_REGISTER_SUCCESS));
			
			DayveItemView.RESULT_ITEM_REGISTER = "SUCCESS";
			
			DayveCategoryAnalysisView.RESULT_ITEM_REGISTER = "SUCCESS";
			
			/**
			 * 등록에 성공하면 Category, Favorite 밑의 Item 갯수도 update 해주어야 한다.
			 */
			DayveCategoryView.RESULT_CATEGORY_REGISTER = "SUCCESS";
			DayveFavoriteView.RESULT_CATEGORY_REGISTER = "SUCCESS";
			
			DayveCategoryView.ACTIVITY_RESULT = "";
			
			DayveGroupInformationView.RESULT_CATEGORY_REGISTER = "SUCCESS";
			
			Intent i = new Intent();
			setResult(RESULT_OK, i);
			
			// Mileage 를 적립한다.
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_UPDATE_MILEAGE));
			
			finish();
		} else {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_ITEM_REGISTER_FAIL));
		}
	}
	
	/**
	 * Item 등록 실패 다이얼로그 창을 띄운다.
	 */
	private void showDialogRegisterItemFail() {
		Log.e(TAG, "showDialogRegisterCategoryFail");
		
		new AlertDialog.Builder(DayveItemRegisterView.this)
		.setTitle(getResources().getString(R.string.item_register_fail_register_title))
		.setMessage(
				getResources().getString(R.string.item_register_fail_register_message_01) + 
				"\n" + 
				getResources().getString(R.string.item_register_fail_register_message_02)
				)
		.setPositiveButton(getResources().getString(R.string.item_register_fail_register_button_ok), 
			new DialogInterface.OnClickListener() {
				
//				@Override
				public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub
				}
			}).show();
	}
	
	/**
	 * Item 등록 성공 Toast 를 띄운다.
	 */
	private void showRegisterItemToast() {
		CharSequence text = getResources().getString(R.string.item_register_success_register);
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	
	/**
	 * 사용자의 마일리지 점수를 가져 와서 5 증가한 뒤 업데이트 한다.
	 */
	private void checkMileage() {
		Log.i(TAG, "checkMileage");
		
		DayveMember dayveMember = new DayveMember();
		
		int intOldMileage = 0;
		
		dayveMember.setId(DAYVE_ID);
		dayveMember.setModifyDate(currentDate);
		
		try {
			intOldMileage = Integer.parseInt(dayveMemberRest.selectMileage(dayveMember).getMileage());
			
			intOldMileage = intOldMileage + 5;
			
			dayveMember.setMileage("" + intOldMileage);
			
			if(("SUCCESS").equals(dayveMemberRest.updateMileage(dayveMember))) {
				Log.i(TAG, "Success to update mileage.");
			} else {
				Log.i(TAG, "Fail to update mileage.");
			}
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	/**
	 * 로그를 저장 한다.
	 */
	private void insertLog() {
		Log.i(TAG, "insertLog");
		
		DayveLog dayveLog = new DayveLog();
		
		dayveLog.setId(DAYVE_ID);
		dayveLog.setViewName(TAG);
		dayveLog.setAccessDate(currentDate);
		
		try {
			dayveCommonRest.registerLog(dayveLog);
			Log.i(TAG, "Success to insert log.");
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Log.e(TAG, "Fail to insert log.");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Log.e(TAG, "Fail to insert log.");
		}
	}
	
	/**
	 * 로그 저장은 UI 와 관계 없기 때문에 background thread 로 구현 함 : child thread
	 */
	private Runnable insertLogBackgroundThreadProcessing = new Runnable() {
		
		public void run() {
			// TODO Auto-generated method stub
			insertLog();
		}
	};
}
